package config

import (
	"encoding/json"
	"os"
	"sync"
)

var (
	config Config
	once   sync.Once
)

// Config 配置结构
type Config struct {
	Version  string         `json:"version"`  // 系统版本
	Server   ServerConfig   `json:"server"`   // 服务器配置
	Database DatabaseConfig `json:"database"` // 数据库配置
	Log      LogConfig      `json:"log"`      // 日志配置
	JWT      JWTConfig      `json:"jwt"`      // JWT配置
	CORS     CORSConfig     `json:"cors"`     // CORS配置
	System   SystemConfig   `json:"system"`   // 系统配置
	Admin    AdminConfig    `json:"admin"`    // 管理员配置
	Upload   UploadConfig   `mapstructure:"upload" json:"upload" yaml:"upload"`
}

// ServerConfig 服务器配置
type ServerConfig struct {
	Port         int    `json:"port"`          // 端口
	Mode         string `json:"mode"`          // 运行模式
	AllowOrigins string `json:"allow_origins"` // 允许的源
}

// DatabaseConfig 数据库配置
type DatabaseConfig struct {
	Host        string `json:"host"`         // 主机地址
	Port        int    `json:"port"`         // 端口
	Username    string `json:"username"`     // 用户名
	Password    string `json:"password"`     // 密码
	Database    string `json:"database"`     // 数据库名
	MaxIdle     int    `json:"max_idle"`     // 最大空闲连接数
	MaxOpen     int    `json:"max_open"`     // 最大打开连接数
	MaxLifetime int    `json:"max_lifetime"` // 连接最大生命周期（秒）
}

// LogConfig 日志配置
type LogConfig struct {
	Level      string `json:"level"`       // 日志级别
	Filename   string `json:"filename"`    // 日志文件名
	MaxSize    int    `json:"max_size"`    // 单个日志文件最大大小（MB）
	MaxBackups int    `json:"max_backups"` // 最大保留日志文件数
	MaxAge     int    `json:"max_age"`     // 最大保留天数
	Compress   bool   `json:"compress"`    // 是否压缩
}

// JWTConfig JWT配置
type JWTConfig struct {
	Secret    string `json:"secret"`     // 密钥
	ExpiresIn int    `json:"expires_in"` // 过期时间（秒）
	TokenType string `json:"token_type"` // 令牌类型
}

// CORSConfig CORS配置
type CORSConfig struct {
	AllowedOrigins []string `json:"allowed_origins"` // 允许的源
	AllowedMethods []string `json:"allowed_methods"` // 允许的方法
	AllowedHeaders []string `json:"allowed_headers"` // 允许的头部
}

// SystemConfig 系统配置
type SystemConfig struct {
	Name        string `json:"name"`         // 系统名称
	CompanyName string `json:"company_name"` // 公司名称
	CompanyLogo string `json:"company_logo"` // 公司Logo
	AdminPath   string `json:"admin_path"`   // 管理路径
}

// AdminConfig 管理员配置
type AdminConfig struct {
	Username string `json:"username"` // 管理员用户名
	Password string `json:"password"` // 管理员密码
}

// UploadConfig 文件上传配置
type UploadConfig struct {
	SavePath     string   `mapstructure:"save-path" json:"savePath" yaml:"save-path"`             // 文件保存路径
	MaxSize      int64    `mapstructure:"max-size" json:"maxSize" yaml:"max-size"`                // 文件最大大小(MB)
	AllowedTypes []string `mapstructure:"allowed-types" json:"allowedTypes" yaml:"allowed-types"` // 允许的文件类型
}

// LoadConfig 加载配置
func LoadConfig(file string) error {
	// 尝试读取指定的配置文件
	data, err := os.ReadFile(file)
	if err != nil {
		// 如果指定的配置文件不存在，尝试读取默认配置文件
		defaultData, defaultErr := os.ReadFile("config/config.json")
		if defaultErr != nil {
			return defaultErr
		}
		data = defaultData
	}

	return json.Unmarshal(data, &config)
}

// SaveConfig 保存配置
func SaveConfig(cfg Config) error {
	data, err := json.MarshalIndent(cfg, "", "    ")
	if err != nil {
		return err
	}
	return os.WriteFile("config/config.json", data, 0644)
}

// GetConfig 获取配置
func GetConfig() Config {
	once.Do(func() {
		if err := LoadConfig("config/config.json"); err != nil {
			panic(err)
		}
	})
	return config
}

// GetServerConfig 获取服务器配置
func GetServerConfig() ServerConfig {
	return config.Server
}

// GetDatabaseConfig 获取数据库配置
func GetDatabaseConfig() DatabaseConfig {
	return config.Database
}

// GetLogConfig 获取日志配置
func GetLogConfig() LogConfig {
	return config.Log
}

// GetJWTConfig 获取JWT配置
func GetJWTConfig() JWTConfig {
	return config.JWT
}
